package accesoRepositorio;

import modelo.gestionCarta.*;
import interfacesRemotas.*;

import java.util.*;
import java.net.InetAddress;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @version 2.0
 * @created 21-mar-2007 23:14:35
 * @author Luis Miguel Merino Bonilla, Carmen Pastor Morales, Carlos Rodriguez Dominguez
 */
public class AccesoCarta extends UnicastRemoteObject implements InterfazCarta
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1512529039455279849L;
	public Seccion m_Seccion;
	public Carta m_Carta;


    public AccesoCarta() throws RemoteException
    {
    	super();
	}

	public void finalize() throws Throwable {

	}

	/**
	 *
	 * @param id_restaurtante
	 */
	public Carta getCarta(int id_restaurante){
        ConexionBD m_ConexionBD = new ConexionBD();
        m_ConexionBD.abrir();
        ResultSet rs;

        rs=(ResultSet)m_ConexionBD.select("SELECT * FROM Carta" +
        					" WHERE id_restaurante="+id_restaurante);
        Carta c=null;

        try{
        	rs.next();
        	
            c = new Carta(rs.getInt("id_carta"), InetAddress.getLocalHost().getHostAddress());
        	c.agregarCollection(getSecciones(rs.getInt("id_carta")));
        }catch(Exception e){
			System.err.println("Error en la clase AccesoCarta en el metodo getCarta: " + e.getMessage());
		}

		m_ConexionBD.cerrar();

		return c;
	}
	
	
	/**

	 *

	 * @param id_producto

	 * @param nombre

	 * @param precio

	 */

	public boolean updateProducto(int id_producto, String nombre, float precio, int estado){

		ConexionBD m_Conexion = new ConexionBD();

		m_Conexion.abrir();

		boolean result=true;



		result &= m_Conexion.update("UPDATE Producto " +

						"SET nombre_producto='"+nombre+

						"', precio="+precio+

						", disponible=" + estado +

						" WHERE id_producto="+id_producto);



		m_Conexion.cerrar();



		return result;

	}

	/**
	 * Recupera de la bd el producto identificado con el id que se le pasa como
	 * paŕametro
	 * @param idProd
	 * @return Producto Procucto recuperado de la bd
	 */
	public Producto getProducto(int idProd)
	{
		ConexionBD bd=new ConexionBD();
		ResultSet rs;
		Producto prod;
		float precio;
		String nomProd,estadoProd;
		if(!bd.abrir())
			return null;
		
		rs=bd.select("SELECT nombre_producto, precio, disponible " +
				"FROM Producto WHERE id_producto="+idProd+";");
		
		if(rs==null)
			{
			bd.cerrar();
			return null;
			}
		
		try {
			rs.first();
			nomProd=rs.getString("nombre_producto");
			precio=rs.getFloat("precio");
			estadoProd=rs.getString("disponible");	
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			bd.cerrar();
			return null;
		}
		prod=new Producto(idProd,precio, nomProd, estadoProd);
		bd.cerrar();
		return prod;
	}
	/**
	 *
	 * @param id_carta
	 */
	private static ArrayList<Seccion> getSecciones(int id_carta){
        ConexionBD m_ConexionBD = new ConexionBD();
        m_ConexionBD.abrir();
        ResultSet rs;

        rs=(ResultSet)m_ConexionBD.select("SELECT * FROM Seccion" +
        					" WHERE id_carta="+id_carta);

        ArrayList<Seccion> vSecciones = new ArrayList<Seccion>();

        try{
        	while (rs.next()) {
        		Seccion s = new Seccion(
        				rs.getString("nombre_seccion"), rs.getInt("id_seccion"));

        		s.agregarCollection(getProductos(rs.getInt("id_seccion")));

        		vSecciones.add(s);
        	}
		}catch(Exception e){
			System.err.println("Error en la clase AccesoCarta en el metodo getSecciones: " + e.getMessage());
			
		}



		m_ConexionBD.cerrar();

//		return (Seccion[])vSecciones.toArray();
		return vSecciones;
	}

	/**
	 *
	 * @param id_seccion
	 */
	//Se ha cambiado Producto[] por ArrayList<Producto>
	private static ArrayList<Producto> getProductos(int id_seccion){
        ConexionBD m_ConexionBD = new ConexionBD();
        m_ConexionBD.abrir();
        ResultSet rs;

        rs=(ResultSet)m_ConexionBD.select("SELECT * FROM Producto" +
        					" WHERE id_seccion="+id_seccion);

        ArrayList<Producto> vProductos = new ArrayList<Producto>();

        try{
        	while (rs.next()) {
        		Producto p = new Producto(rs.getInt("id_producto"),
        				rs.getFloat("precio"),
        				rs.getString("nombre_producto"),
        				rs.getString("disponible"));

        		vProductos.add(p);
        	}
		}catch(Exception e){
			System.err.println("Error en la clase AccesoCarta en el metodo getProductos: " + e.getMessage());
			m_ConexionBD.cerrar();
			return null;
		}



		m_ConexionBD.cerrar();

//		return (Producto[])vProductos.toArray();
		return vProductos;
	}

	/**
	 *
	 * @param id_carta
	 * @param nombre
	 */
	public boolean insertSeccion(int id_carta, String nombre, int id){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result;
		int idSeccion;

		if(id<0)
			idSeccion = m_Conexion.generaId("Seccion","id_seccion");
		else
			idSeccion=id;

		result = m_Conexion.insert("INSERT INTO Seccion VALUES (" +
						idSeccion+ ",'"+nombre+"',"+id_carta+")");

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param id_seccion
	 */
	public boolean deleteSeccion(int id_seccion){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result=true;

/*		Con el ON DELETE CASCADE no hace falta borrar esto a mano
		result &= m_Conexion.delete("DELETE FROM Producto " +
				"WHERE id_seccion="+id_seccion);
		*/

		result &= m_Conexion.delete("DELETE FROM Seccion " +
						"WHERE id_seccion="+id_seccion);

		m_Conexion.cerrar();

		return result;

	}

	/**
	 *
	 * @param id_carta
	 */
	public boolean deleteCarta(int id_carta){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result= m_Conexion.delete("DELETE FROM Carta " +
				"WHERE id_carta="+id_carta);

		m_Conexion.cerrar();

		return result;

	}

	/**
	 *
	 * @param id_seccion
	 * @param nombre_nuevo
	 */
	public boolean updateSeccion(int id_seccion, String nombre_nuevo){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result=true;

		result &= m_Conexion.update("UPDATE Seccion " +
						"SET nombre_seccion='"+nombre_nuevo+
						"' WHERE id_seccion="+id_seccion);

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param id_seccion
	 * @param nombre
	 * @param precio
	 */
	public boolean insertProducto(int id_producto,int id_seccion, String nombre, float precio){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result=true;
		int id;

		if(id_producto<0)
			id=m_Conexion.generaId("Producto","id_producto");
		else
			id=id_producto;


		result &= m_Conexion.insert("INSERT INTO Producto " +
				" VALUES("+id+",'"+nombre+"',"+precio+",1,"+id_seccion+
				")");

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param nombre_carta
	 * @param id_restaurante
	 * @param id_carta
	 */
	public boolean insertCarta(String nombre_carta, int id_restaurante, int id_carta){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result=true;

		//si es una carta nueva genera un id nuevo
		if (id_carta==-1)
			id_carta=m_Conexion.generaId("Carta","id_carta");

		result &= m_Conexion.insert("INSERT INTO Carta " +
				" VALUES("+id_carta+",'"+nombre_carta+".', default, "+id_restaurante+")");

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param id_producto
	 */
	public boolean deleteProducto(int id_producto){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result=true;

		result &= m_Conexion.delete("DELETE FROM Producto " +
				" WHERE id_producto="+id_producto);

		m_Conexion.cerrar();

		return result;
	}

	/**
	 *
	 * @param id_producto
	 * @param nombre
	 * @param precio
	 */
	public boolean updateProducto(int id_producto, String nombre, float precio){
		ConexionBD m_Conexion = new ConexionBD();
		m_Conexion.abrir();
		boolean result=true;

		result &= m_Conexion.update("UPDATE Producto " +
						"SET nombre_producto='"+nombre+
						"', precio="+precio+
						" WHERE id_producto="+id_producto);

		m_Conexion.cerrar();

		return result;
	}

	public int generaIdProducto(){
		ConexionBD m_ConexionBD = new ConexionBD();
		m_ConexionBD.abrir();
		int id=m_ConexionBD.generaId("Producto","id_producto");
		
		m_ConexionBD.cerrar();

		return id;
	}
}
